Redis发布与订阅模式在SpringBoot下的使用与应用场景

5,073次阅读
4 条评论

共计 1995 个字符,预计需要花费 5 分钟才能阅读完成。

前言

Redis 相信对于各位开发者的朋友来说都不会陌生,特别是后端的朋友会经常性的用到 Redis 来进行数据缓存等操作,今日我们就来聊聊 Redis 的发布(Pub)与订阅(Sub)模式的在 SpringBoot 下如何使用,并谈谈相关的应用场景。

使用方法

首先我们需要配置 redis 的相关依赖包:

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

然后我们需要配置 Redis 消息的监听容器:

@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
                                        MessageListenerAdapter listenerAdapter) {RedisMessageListenerContainer container = new RedisMessageListenerContainer();
    container.setConnectionFactory(connectionFactory);
    container.addMessageListener(listenerAdapter, new PatternTopic("topicName")); // 配置名称
    return container;
}

接着我们新建一个消息实体,用于发送数据:

@Data
@AllArgsConstructor
public class Notice implements Serializable {

    private String name;

    private String val;

}

现在基本配置和消息数据体我们都定义好了,接着我们需要配置一个订阅端,用于监听订阅的消息:

@Component
@Slf4j
public class LicoyWorkMessageListener extends MessageListenerAdapter {

    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public void onMessage(Message message, byte[] pattern) {byte[] body = message.getBody();
        byte[] channel = message.getChannel();
        String topic = (String) redisTemplate.getStringSerializer().deserialize(channel);
        if(!topic.equals("topicName")){return;}
        Object res = redisTemplate.getValueSerializer().deserialize(body);
        if(res instanceof Notice){ // 如果反序列化得到的是我们定义的消息数据体类型
            Notice notice = (Notice)res;
            System.out.println(notice);
        }else{// 其他处理}
    }
}

Redis 发布与订阅模式在 SpringBoot 下的使用与应用场景 到这一步,万事俱备只欠东风了,现在我们只需要在需要用到的地方发布消息即可,如(作为演示,我直接在部分逻辑写在 controller 层,实际业务不建议这么做):

@GetMapping("/notice/{name}/{val}")
public ResponseResult<String> notice(@PathVariable String name,@PathVariable String val){redisTemplate.convertAndSend("topicName", new Notice(name,val));
    return ResponseResult.ok();}

使用场景

对于使用场景,就谈谈博主在开发中所用到的地方之一,一个平台,其分别有用户端 / 商家端,包含一个简单的 Socket 连接,用于商家及用户工单会话的消息通知,但是这两个是单独的 Application,所以各自的 Socket-Session 分别保存在对应的内存栈中,因为不想让此复杂所以就没有采用其他框架就默认使用 Springboot 内置的 WebSocket,但是 WebSocketSession 这个对象不支持序列化,所以就无法缓存到 Redis 中,那么只有(方法不一)两个端同时订阅一个频道,然后有新消息的时候通知两个端分别进行处理来发送消息给用户还是商家。

尾记

在实际开发的过程中,我们所遇到的问题会远比自己所设想的多,但是这并不是 100% 的,只要思想不滑坡,办法总比困难多,加油!

另外双十二即将来临,你准备再一波剁手了么 Redis 发布与订阅模式在 SpringBoot 下的使用与应用场景

正文完
使用官方微信小程序体验更多功能
post-qrcode
 9
憧憬Licoy
版权声明:本站原创文章,由 憧憬Licoy 于2019-12-07发表,共计1995字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(4 条评论)
新闻头条 评论达人 LV.1
2020-03-08 17:53:45 回复

文章非常好超喜欢

 Windows  Chrome  中国广西贺州市电信
今日头条新闻 评论达人 LV.1
2020-02-26 00:45:25 回复

文章不错支持一下吧,非常喜欢,来学习一下

 Windows  Chrome  中国广西贺州市联通
新闻头条 评论达人 LV.1
2020-01-14 01:05:30 回复

文章不错支持一下吧,非常喜欢

 Windows  Chrome  中国广西贺州市联通
今日新鲜事 评论达人 LV.1
2019-12-27 01:18:11 回复

文章不错支持一下吧

 Windows  Chrome  中国广西贺州市联通

憧憬点滴记忆

公告
Puock是一款基于WordPress开发的高颜值自适应开源主题,支持白天与黑夜模式、无刷新加载等功能。
文章搜索
憧憬点滴记忆
憧憬点滴记忆
Licoy's Blog关注互联网及软件IT技术的个人博客
今日一言
-「
热门文章
《活着》 – 人所体现生命的价值

《活着》 – 人所体现生命的价值

前言 在新年目标中为了定了一个读书计划,计划在 18 年中阅读 20 本各方面的书籍,目前阅读计划已经阅读了两...
Chatroulette-全世界随机视频聊天网站

Chatroulette-全世界随机视频聊天网站

介绍 Chatroulette 被人们叫做“聊天轮盘”是由一个 17 岁俄国高中生创立的随机视频聊天网站。该网...
Puock主题常见问题汇总

Puock主题常见问题汇总

前言 最近经常会收到小伙伴的一些老生常谈过的的问题,鉴于有些小伙伴因为网络原因无法及时访问到 Github 上...
SpringCloud使用Zuul出现“Forwarding error”错误解决方法

SpringCloud使用Zuul出现“Forwarding error”错误解决方法

起因 博主在使用 zuul 的时候,所有的配置都是配置完全了的,但是只要一访问服务就出现 500,然后查看控制...
岛屿数量计算中的DFS和BFS的应用

岛屿数量计算中的DFS和BFS的应用

前言 计算岛屿数量是在由 ’0’ 与 ’1’ 的二维网格中寻找...
最新评论
憧憬Licoy 憧憬Licoy 暂时不做友联申请了
憧憬Licoy 憧憬Licoy 暂时不做友联申请了
YanQS YanQS 名称:YanQS's Blog 网址:https://yanqs.me/
ygtg ygtg 很好 :beer:
ssdfg ssdfg 用户中心太简陋了! :grin:
mp4网 mp4网 申请友链 名称:mp4网 地址:http://mp4wang.cc 描述:多来看看
xf xf 感谢作者的分享
朵朵 朵朵 过来看看
热评文章